java IO相关(一) unix的五种模型
Uinx IO 模型
unix 的io 模型分为以下5类
阻塞io
当用户发起io请求后,等待数据,程序将数据从内核复制到程序缓冲区中,整个操作都是阻塞状态。
非阻塞io
当用户发起请求后,不等待数据,而是返回一个数据未准备完成的标志。
操作系统内核将准备要操作的数据,这个过程中程序会轮训的请求操作,直到操作系统将数据准备好。当程序轮训到系统内核响应数据准备好了之后,程序再将数据复制到程序自身的缓冲区
io复用模型
我们常用select和poll函数使用了io复用模型。
当用户调用select函数的时候会阻塞,select函数会系统调用操作内核进行数据报的准备工作。当数据报准备完成后,程序直接复制数据包的内容到程序缓冲区中,io复用现在看来和阻塞io没有什么区别。但是当用户比较多的时候优势就展现出来了,假设有100个用户阻塞io会阻塞100个进程处理io.
如果是io复用模型,则用1个线程去管理这100个io请求。
信号驱动io
我们可以使用信号.当用户发起io请求后,使程序接受操作系统的信号通知。
不等待数据。此时操作系统进行数据报的准备,当数据报准备完成之后会以信号的方式通知程序。程序收到数据准备完成的信号通知后,在将数据复制到程序缓冲区中。
异步io
当用户发起请求后不等待数据,操作系统内核直接将数据复制到程序的缓存区中,等到复制完成之后在通知程序操作成功。
总结
前四种io模型都属于同步io,其中的第二阶段相同,都属于数据报准备完成后,操作系统内核将数据复制到程序的缓存区中。
- 阻塞io则在数据准备和数据准备完成一直处于阻塞中
- 非阻塞io则是轮训的方式一直请求操作系统内核数据报是否准备完成
- 多路复用io则是发起io请求后,调用select。select单线程来判断那个io请求的数据报是否准备好。然后系统直接调用。
- 信号io则是 操作系统内核在数据报准备好的时候以信号的方式通知程序
- 异步io全程都是操作系统进行io处理,在处理io结束后通知程序
- 异步非异步的区别是io操作过程是否由操作系统处理。
- 阻塞非阻塞是io操作,操作系统是否返回一个标志告知io操作是否完成
相关博客
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment